#include "server_ListenerThread.h"

#include <sstream>
#include <string>

#include "server_Servidor.h"

ListenerThread::ListenerThread(Servidor* servidor, int puerto) :
					servidor(servidor), puerto(puerto) { }

ListenerThread::~ListenerThread() { }

void* ListenerThread::run() {
	if (!socket.enlazar(puerto)) {
		servidor->getLogger().logApertura(puerto, false);

		servidor->aumentarFallas();
	}else {
		if (socket.escuchar() == 0) {
			servidor->getLogger().logApertura(puerto, true);
			while (servidor->estaEncendido()) {
				int newSocketFD = socket.aceptar();
				if (newSocketFD != -1) {
					servidor->getLogger().logAceptarConexion(puerto);
					procesarCliente(newSocketFD);
				}
			}
		}else {
			servidor->getLogger().logApertura(puerto, false);
			servidor->aumentarFallas();
		}
	}

	return NULL;
}

void ListenerThread::procesarCliente(int socketFD) {
	Socket socket(socketFD);

	std::stringstream ss;
	std::string respuesta;

	// Envio el mensaje de bienvenida
	ss << "PUERTO " << puerto << " Aceptado. Recibiendo datos...";
	socket.enviar(ss.str());

	// Recibo el archivo
	uint32_t cantidadRecibida = socket.recibir(respuesta);

	// Seteo el mensaje a enviar
	ss.clear();
	ss.str("");
	ss << "Datos recibidos exitosamente. Cantidad de bytes recibidos: "
	   << cantidadRecibida;

	// Envio la cantidad de bytes recibidos
	servidor->getLogger().logFinalizarRecepcion(puerto, cantidadRecibida);
	socket.enviar(ss.str());

	// Cierro la conexion
	socket.desconectar();
	socket.cerrar();

	servidor->getLogger().logFinalizarConexion(puerto);
}

void ListenerThread::cerrarConexion() {
	socket.desconectar();
	socket.cerrar();
}
